class Solution {
public:
    int trap(vector<int>& h) {
        int n = h.size();
        vector<int> prefix(n);
        vector<int> subfix(n);
        int ans = 0;
        prefix[0] = h[0];
        for(int i = 1; i < n; i++)
            prefix[i] = max(prefix[i - 1], h[i]);
        subfix[n - 1] = h[n - 1];
        for(int i = n - 2; i >= 0; i--)
            subfix[i] = max(subfix[i + 1], h[i]);

        for(int i = 0; i < n; i++)
            ans += min(prefix[i], subfix[i]) - h[i];
        
        return ans;
    }
};